package com.tidy.seed.util;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * mp代码生成器
 * by 青哥哥
 *
 * @since 2022-01-26
 */
public class CodeGenerator {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入模块名：");
        String moduleNameInput = scanner.nextLine();

        System.out.println("请输入要生成代码的表名，多个表名用逗号分隔：");
        String tableNamesInput = scanner.nextLine();
        scanner.close();

        String[] tableNames = tableNamesInput.split(",");
        generate(tableNames, moduleNameInput);
    }

    private static void generate(String[] tableNames, String moduleName) {
        String projectPath = System.getProperty("user.dir");
        System.out.println("projectPath：" + projectPath);
        FastAutoGenerator
                .create("jdbc:mysql://localhost:3306/boot_api?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8", "root", "root")
                .globalConfig(builder -> {
                    builder.author("HZ-ZY") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
//                            .fileOverride() // 关键：开启文件覆盖（重复生成时替换已有文件）
                            .outputDir(projectPath + "/src/main/java"); // 指定输出目录
                }).packageConfig(builder -> {
                    builder.parent("com.tidy.seed") // 父包名
                            .moduleName(moduleName.trim().isEmpty() ? null : moduleName); // 模块名

                    // 构建路径映射（关键：用一个Map包含所有路径配置）
                    Map<OutputFile, String> pathInfo = new HashMap<>();

                    // 处理模块名空值情况，避免生成无效目录
                    String modulePath = moduleName.trim().isEmpty() ? "" : moduleName + "/";

                    // 实体类输出路径
                    pathInfo.put(OutputFile.entity,
                            projectPath + "/src/main/java/com/seed/bootapi/" + modulePath + "entity");

                    //controller接口输出路径
                    pathInfo.put(OutputFile.controller,
                            projectPath + "/src/main/java/com/seed/bootapi/" + modulePath + "controller");
                    // service接口输出路径
                    pathInfo.put(OutputFile.service,
                            projectPath + "/src/main/java/com/seed/bootapi/" + modulePath + "service");
                    // impl接口输出路径
                    pathInfo.put(OutputFile.serviceImpl,
                            projectPath + "/src/main/java/com/seed/bootapi/" + modulePath + "service/impl");
                    // Mapper接口输出路径
                    pathInfo.put(OutputFile.mapper,
                            projectPath + "/src/main/java/com/seed/bootapi/" + modulePath + "mapper");

                    // Mapper XML输出路径
                    pathInfo.put(OutputFile.xml,
                            projectPath + "/src/main/resources/mapper/" + modulePath);

                    // 一次性设置所有路径（仅调用一次pathInfo）
                    builder.pathInfo(pathInfo);
                }).strategyConfig(builder -> {
                    builder.entityBuilder()
                            .enableLombok()
                            .enableFileOverride(); // 开启实体类文件覆盖
//                    builder.mapperBuilder().enableMapperAnnotation().build();
                    // Mapper接口覆盖
                    builder.mapperBuilder()
                            .enableFileOverride(); // 开启Mapper接口覆盖

                    builder.serviceBuilder()
                            .formatServiceFileName("%sService")
                            .formatServiceImplFileName("%sServiceImpl")
                            .enableFileOverride(); // 开启Service文件覆盖


                    builder.controllerBuilder()
                            .enableHyphenStyle()  // 开启驼峰转连字符
                            .enableRestStyle()  // 开启生成@RestController 控制器
                            .enableFileOverride(); // 开启Service文件覆盖

                    builder.addInclude(tableNames) // 设置需要生成的表名
                            .addTablePrefix("t_", "sys_"); // 设置过滤表前缀
                })
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}